import os
import re


def natural_sort_key(text):
    """自然排序辅助函数，支持文件名中的数字序号"""
    return [int(c) if c.isdigit() else c.lower()
            for c in re.split(r'(\d+)', text)]


def numeric_rename(directory, padding=4, sort_by='name'):
    """
    自增数字重命名工具

    参数：
    directory - 目标目录路径
    padding   - 序号位数（默认4位，如0001）
    sort_by   - 排序方式：'name'按文件名 | 'time'按修改时间
    """
    # 获取文件列表并过滤
    files = [f for f in os.listdir(directory)
             if f.lower().endswith('.wav')]

    # 设置排序方式
    if sort_by == 'name':
        files.sort(key=natural_sort_key)
    elif sort_by == 'time':
        files.sort(key=lambda x: os.path.getmtime(
            os.path.join(directory, x)))

    # 初始化计数器
    counter = 1

    for filename in files:
        # 生成新文件名（自动补零）
        new_name = f"{counter:0{padding}d}.wav"
        old_path = os.path.join(directory, filename)
        new_path = os.path.join(directory, new_name)

        # 跳过已符合目标格式的文件
        if filename == new_name:
            print(f"🟢 已标准化: {filename}")
            counter += 1
            continue

        # 处理文件名冲突
        if os.path.exists(new_path):
            print(f"🔴 冲突跳过: {filename} → {new_name} 已存在")
            continue

        # 执行重命名
        os.rename(old_path, new_path)
        print(f"🔄 重命名成功: {filename} → {new_name}")
        counter += 1


# 使用示例（按文件名自然排序，4位序号）
numeric_rename(
    directory=r"D:\So-VITS-SVC新版\新版整合包\so-vits-svc\dataset_raw\jingxiang",
    padding=1,
    sort_by='name'  # 可选 'time' 按修改时间排序
)